package ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.combobox;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import ar.uba.fi.taller2.cmmiassistant.controlador.Controlador;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.Etiqueta;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.Item;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.comparators.NumeroObjetivoComparator;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.etiquetas.EtiquetaBeanProperty;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.etiquetas.EtiquetaCompuesta;
import ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.etiquetas.EtiquetaConstante;
import ar.uba.fi.taller2.cmmiassistant.modelo.cmmi.AreaProceso;
import ar.uba.fi.taller2.cmmiassistant.modelo.cmmi.Objetivo;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Evaluacion;
import ar.uba.fi.taller2.cmmiassistant.observador.ServicioNotificacion;

public class ComboBoxModelObjetivos extends ComboBoxModelAdapter {

    protected static final Etiqueta SEPARADOR = new EtiquetaConstante(" . ");

    private final List<Objetivo> objetivos = new ArrayList<Objetivo>();

    public ComboBoxModelObjetivos() {

    }

    public Controlador getControlador() {

        return this.controlador;
    }

    public void setControlador(Controlador controlador) {

        super.setControlador(controlador);
        ServicioNotificacion.addObservador(controlador.getModelo()
                .getEvaluacionSeleccionada(), this);
        ServicioNotificacion.addObservador(controlador.getModelo()
                .getAreaProcesoSeleccionada(), this);
        
    }

    protected void actualizarItems() {

        this.getItems().clear();

        Evaluacion evaluacion = this.getControlador().getModelo()
                .getEvaluacionSeleccionada().getValor();

        AreaProceso areaProceso = this.getControlador().getModelo()
                .getAreaProcesoSeleccionada().getValor();

        if ((evaluacion != null) && (areaProceso != null)) {

            this.getObjetivos().clear();
            evaluacion.getRepresentacion().getObjetivos(areaProceso,
                    this.getObjetivos());
            Collections.sort(this.getObjetivos(), NumeroObjetivoComparator
                    .instance());

            for (Objetivo objetivo : this.getObjetivos()) {

                Item item = new Item(
                        new EtiquetaCompuesta(new EtiquetaBeanProperty(
                                objetivo, "Numero"), SEPARADOR,
                                new EtiquetaBeanProperty(objetivo, "nombre")));

                this.getItems().add(item);
            }
        }
    }

    public List<Objetivo> getObjetivos() {

        return this.objetivos;
    }
    
    public Objetivo getObjetivo(int index) {
        
        return index >= 0 ? this.getObjetivos().get(index) : null;
    }

    public int indexOf(Objetivo objetivo) {

        return this.getObjetivos().indexOf(objetivo);
    }
}
